import cloudHelper from '../helpers/cloud/cloud_helper';
// 使用统一配置入口引用模型
const { ProjectModel } = require('../../config/models_config');
import SmartCache from '../../helpers/smart_cache';

// 创建项目缓存实例
const projectCache = new SmartCache('project', 5 * 60 * 1000); // 5分钟缓存

// API路由
const API_ROUTES = {
  LIST: 'project/list',
  DETAIL: 'project/detail',
  CREATE: 'project/insert',
  EDIT: 'project/edit',
  DELETE: 'project/del'
};

/**
 * 项目仓储层
 * 负责项目数据的持久化和检索
 */
class ProjectRepository {
  /**
   * 获取项目列表
   * @param {Object} params 查询参数
   */
  async getProjectList(params = {}) {
    const cacheKey = `list:${JSON.stringify(params)}`;
  
    try {
      // 尝试从缓存获取
      return await projectCache.get(cacheKey, async () => {
        // 从云函数获取数据
        const result = await cloudHelper.callCloudData(API_ROUTES.LIST, params);
      
        // 转换为领域模型
        if (result && result.list) {
          result.list = result.list.map(item => new ProjectModel(item));
        }
      
        return result;
      });
    } catch (err) {
      console.error('[ProjectRepository] getProjectList 错误:', err);
      throw err;
    }
  }
  
  /**
   * 获取项目详情
   * @param {String} id 项目ID
   */
  async getProjectById(id) {
    if (!id) throw new Error('项目ID不能为空');
  
    const cacheKey = `detail:${id}`;
  
    try {
      // 尝试从缓存获取
      return await projectCache.get(cacheKey, async () => {
        // 从云函数获取数据
        const result = await cloudHelper.callCloudData(API_ROUTES.DETAIL, {id});
      
        // 转换为领域模型
        return result ? new ProjectModel(result) : null;
      });
    } catch (err) {
      console.error('[ProjectRepository] getProjectById 错误:', err);
      throw err;
    }
  }
  
  /**
   * 创建项目
   * @param {ProjectModel} project 项目模型
   */
  async createProject(project) {
    try {
      // 验证项目数据
      const validation = project.validate();
      if (!validation.valid) {
        throw new Error('项目数据验证失败: ' + JSON.stringify(validation.errors));
      }
    
      // 转换为存储格式
      const data = project.toStorage();
    
      // 调用云函数
      const result = await cloudHelper.callCloudSumbit(API_ROUTES.CREATE, {
        project: data
      });
    
      // 清除列表缓存
      projectCache.removeByPattern('^list:');
    
      return result;
    } catch (err) {
      console.error('[ProjectRepository] createProject 错误:', err);
      throw err;
    }
  }
  
  /**
   * 更新项目
   * @param {ProjectModel} project 项目模型
   */
  async updateProject(project) {
    try {
      if (!project._id) throw new Error('更新项目时ID不能为空');
    
      // 验证项目数据
      const validation = project.validate();
      if (!validation.valid) {
        throw new Error('项目数据验证失败: ' + JSON.stringify(validation.errors));
      }
    
      // 转换为存储格式
      const data = project.toStorage();
    
      // 调用云函数
      const result = await cloudHelper.callCloudSumbit(API_ROUTES.EDIT, {
        id: project._id,
        data: data
      });
    
      // 清除相关缓存
      projectCache.removeByPattern(`^detail:${project._id}`);
      projectCache.removeByPattern('^list:');
    
      return result;
    } catch (err) {
      console.error('[ProjectRepository] updateProject 错误:', err);
      throw err;
    }
  }

  /**
   * 删除项目
   * @param {String} id 项目ID
   */
  async deleteProject(id) {
    try {
      if (!id) throw new Error('删除项目时ID不能为空');
      
      // 调用云函数
      const result = await cloudHelper.callCloudSumbit(API_ROUTES.DELETE, {
        id
      });
      
      // 清除相关缓存
      projectCache.removeByPattern(`^detail:${id}`);
      projectCache.removeByPattern('^list:');
      
      return result;
    } catch (err) {
      console.error('[ProjectRepository] deleteProject 错误:', err);
      throw err;
    }
  }

  /**
   * 获取项目缓存实例
   * 允许外部访问项目缓存，用于高级缓存管理
   */
  getCache() {
    return projectCache;
  }
  
  /**
   * 清除所有项目相关缓存
   */
  clearCache() {
    projectCache.clear();
  }
  
  /**
   * 清除指定项目的缓存
   * @param {String} id 项目ID
   */
  clearProjectCache(id) {
    if (id) {
      projectCache.removeByPattern(`^detail:${id}`);
    }
    projectCache.removeByPattern('^list:');
  }
}

export default new ProjectRepository(); 